package org.pupil.rpc.annotation;

import org.pupil.rpc.common.constants.FaultTolerantRules;
import org.pupil.rpc.common.constants.LoadBalancerRules;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 服务调用方注解
 * @Retention(RetentionPolicy.RUNTIME) 表示注解会在运行时保留，并且可以通过反射机制在运行时获取
 * @Target(ElementType.FIELD)  表示注解只能应用于字段（Field）上
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface RpcReference {
    /**
     * 版本
     * 默认 版本 = 1.0
     * @return
     */
    String serviceVersion() default "1.0";

    /**
     * 超时时间
     * 默认 超时时间 = 5000(5s)
     * @return
     */
    long timeout() default 5000;

    /**
     * 可选的负载均衡:consistentHash,roundRobin...
     * {@link org.pupil.rpc.common.constants.LoadBalancerRules}
     * 默认 轮询算法
     * @return
     */
    String loadBalancer() default LoadBalancerRules.RoundRobin;

    /**可选的容错策略:failover,failFast,failsafe...
     * {@link org.pupil.rpc.common.constants.FaultTolerantRules}
     * 默认 快速失败
     * @return
     */
    String faultTolerant() default FaultTolerantRules.FailFast;

    /**
     * 重试次数
     * 默认 重试次数 = 3
     * @return
     */
    long retryCount() default 3;
}
